package net.ib.mtalk.network.serverapi;

import net.ib.mntalk.protocol.Session.SelectReq;
import net.ib.mtalk.network.MethodId.Session;
import net.ib.mtalk.network.NetResultReceiver;
import net.ib.mtalk.network.TcpClient;
import net.ib.mtalk.network.TcpEnvelope;

/**
 * Server-side API: Notification<br>
 * rpc Select()<br>
 * @author Arngard
 */
public class Notification {
	
	/**
	 * rpc Select()<br>
	 * 주어진 인자로 {@link TcpEnvelope}을 만들어서 네트워크 요청까지 해 주는 래퍼 메소드. 
	 * @param req 요청의 GPB 객체
	 * @param callback 결과를 받을 콜백
	 * @return 보낼 때 사용한 Request ID
	 */
	public static int select(SelectReq req, NetResultReceiver callback) {
		return select(req, callback, Long.MAX_VALUE);
	}
	
	/**
	 * rpc Select()<br>
	 * 주어진 인자로 {@link TcpEnvelope}을 만들어서 네트워크 요청까지 해 주는 래퍼 메소드. 
	 * @param req 요청의 GPB 객체
	 * @param callback 결과를 받을 콜백
	 * @param expirationLimit TcpEnvelope에 세팅하는 유통기한
	 * @return 보낼 때 사용한 Request ID
	 */
	public static int select(SelectReq req, NetResultReceiver callback, long expirationLimit) {
		int reVal = TcpEnvelope.getNewRequestId();

		// TcpEnvelope!
		TcpEnvelope reqEnvelope = new TcpEnvelope.Builder()
		.setRequestId(reVal)
		.setType(TcpEnvelope.REQUEST)
		.setMethodId(Session.Notification.Select)
		.setMessage(req)
		.setCallback(callback)
		.setExpireTime(expirationLimit)
		.build();

		// Send!
		TcpClient.send(reqEnvelope);
		
		return reVal;
	}
}
